home *** CD-ROM | disk | FTP | other *** search
/ The Java 3D API Specification (2nd Edition) / The Java 3D API Specification (2nd Edition).iso / programs / examples / Billboard / BboardPt.java < prev    next >
Text File  |  2000-04-28  |  11KB  |  298 lines

  1. /*
  2.  *    @(#)BboardPt.java 1.8 00/03/31 14:30:28
  3.  *
  4.  * Copyright (c) 1996-2000 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
  7.  * modify and redistribute this software in source and binary code form,
  8.  * provided that i) this copyright notice and license appear on all copies of
  9.  * the software; and ii) Licensee does not utilize the software in a manner
  10.  * which is disparaging to Sun.
  11.  *
  12.  * This software is provided "AS IS," without a warranty of any kind. ALL
  13.  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
  14.  * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  15.  * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
  16.  * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
  17.  * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
  18.  * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
  19.  * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
  20.  * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
  21.  * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
  22.  * POSSIBILITY OF SUCH DAMAGES.
  23.  *
  24.  * This software is not designed or intended for use in on-line control of
  25.  * aircraft, air traffic, aircraft navigation or aircraft communications; or in
  26.  * the design, construction, operation or maintenance of any nuclear
  27.  * facility. Licensee represents and warrants that it will not use or
  28.  * redistribute the Software for such purposes.
  29.  */
  30.  
  31. import java.applet.Applet;
  32. import java.awt.BorderLayout;
  33. import java.awt.event.*;
  34. import com.sun.j3d.utils.image.TextureLoader;
  35. import com.sun.j3d.utils.applet.MainFrame;
  36. import com.sun.j3d.utils.geometry.ColorCube;
  37. import com.sun.j3d.utils.geometry.Cone;
  38. import com.sun.j3d.utils.geometry.Cylinder;
  39. import com.sun.j3d.utils.geometry.Sphere;
  40. import com.sun.j3d.utils.universe.*;
  41. import javax.media.j3d.*;
  42. import javax.vecmath.*;
  43. import java.io.*;
  44. import java.awt.*;
  45. import com.sun.j3d.utils.behaviors.mouse.*;
  46.  
  47. public class BboardPt extends Applet {
  48.  
  49.     // setup font stuff
  50.     private String fontName = "TestFont";
  51.     private String textString = "Billboard";
  52.     float sl = textString.length();
  53.  
  54.     // paths to texture image files
  55.     private java.net.URL earthImage = null;
  56.     private java.net.URL stoneImage = null;
  57.  
  58.  
  59.     public BranchGroup createSceneGraph() {
  60.  
  61.     // Create the root of the branch graph
  62.     BranchGroup objRoot = new BranchGroup();
  63.  
  64.         TransformGroup objScale = new TransformGroup();
  65.         Transform3D textMat = new Transform3D();
  66.         // Assuming uniform size chars, set scale to fit string in view
  67.         textMat.setScale(1.2/sl);
  68.         objScale.setTransform(textMat);
  69.  
  70.  
  71.  
  72.     // Create the transform group node and initialize it to the
  73.     // identity.  Enable the TRANSFORM_WRITE capability so that
  74.     // our behavior code can modify it at runtime.  Add it to the
  75.     // root of the subgraph.
  76.     TransformGroup objTrans = new TransformGroup();
  77.     objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  78.     objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
  79.     objRoot.addChild(objTrans);
  80.  
  81.     BoundingSphere bounds =
  82.         new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  83.  
  84.         Appearance apText = new Appearance();
  85.     Material m = new Material();
  86.         m.setLightingEnable(true);
  87.     apText.setMaterial(m);
  88.  
  89.  
  90.         Appearance apEarth= new Appearance();
  91.         Material mm = new Material();
  92.         mm.setLightingEnable(true);
  93.     apEarth.setMaterial(mm);
  94.  
  95.         Appearance apStone = new Appearance();
  96.     apStone.setMaterial(mm);
  97.  
  98. // create 3D text 
  99.         Font3D f3d = new Font3D(new Font(fontName, Font.PLAIN, 2),
  100.                                 new FontExtrusion());
  101.     Point3f textPt = new Point3f( -sl/2.0f, 3.0f, 0.0f);
  102.         Text3D txt = new Text3D(f3d, textString, textPt); 
  103.         Shape3D textShape = new Shape3D();
  104.         textShape.setGeometry(txt);
  105.         textShape.setAppearance(apText);
  106.  
  107.  
  108.  
  109.    // Using billboard behavior on text3d
  110.  
  111.         TransformGroup bbTransPt = new TransformGroup();
  112.         bbTransPt.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  113.         bbTransPt.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
  114.         Billboard bboardPt = new Billboard( bbTransPt );
  115.         objTrans.addChild( bboardPt );
  116.         bboardPt.setSchedulingBounds( bounds );
  117.     bboardPt.setAlignmentMode(Billboard.ROTATE_ABOUT_POINT);
  118.  
  119.     // text is centered around 0, 3, 0.  Make it rotate around 0,5,0
  120.     Point3f rotationPt = new Point3f(0.0f, 5.0f, 0.0f);
  121.     bboardPt.setRotationPoint(rotationPt);
  122.         objScale.addChild( bbTransPt );
  123.         bbTransPt.addChild( textShape );
  124.  
  125.     // also add a small Sphere to the Billboard at the rotation point to 
  126.     // show that we are rotating around the right point
  127.     Sphere sphere = new Sphere(0.2f);
  128.     TransformGroup sphereGroup = new TransformGroup();
  129.     Transform3D sphereXform = new Transform3D();
  130.     sphereXform.set(new Vector3f(rotationPt));
  131.     sphereGroup.setTransform(sphereXform);
  132.     sphereGroup.addChild(sphere);
  133.     bbTransPt.addChild(sphereGroup);
  134.  
  135.  
  136.     // Create a simple shape leaf node, add it to the scene graph.
  137.  
  138.     Transform3D cubeMat = new Transform3D();
  139.     TransformGroup cubeTrans = new TransformGroup(cubeMat);
  140.     cubeMat.set(new Vector3d(0.9, 0.0, -1.0));
  141.     cubeTrans.setTransform(cubeMat);
  142.     cubeTrans.addChild(new ColorCube(0.3));
  143.         objTrans.addChild(cubeTrans);
  144.  
  145.         TextureLoader stoneTex = new TextureLoader(stoneImage, new String("RGB"), this);
  146.         if (stoneTex != null) apStone.setTexture(stoneTex.getTexture());
  147.  
  148.      TextureAttributes texAttr = new TextureAttributes();
  149.      texAttr.setTextureMode(TextureAttributes.REPLACE);
  150.      apStone.setTextureAttributes(texAttr);
  151.  
  152.     Transform3D coneMat = new Transform3D();
  153.     TransformGroup coneTrans = new TransformGroup(coneMat);
  154.     coneMat.set(new Vector3d(0.0, 0.0, 0.0));
  155.     coneTrans.setTransform(coneMat);
  156.     coneTrans.addChild(new Cone(.2f, 0.8f,Cone.GENERATE_NORMALS |
  157.                     Cone.GENERATE_TEXTURE_COORDS, apStone));
  158.         objTrans.addChild(coneTrans);
  159.  
  160.         TextureLoader earthTex = new TextureLoader(earthImage, new String("RGB"), this);
  161.         if (earthTex != null) apEarth.setTexture(earthTex.getTexture());
  162.      apEarth.setTextureAttributes(texAttr);
  163.  
  164.     Transform3D cylinderMat = new Transform3D();
  165.     TransformGroup cylinderTrans = new TransformGroup(cylinderMat);
  166.     cylinderMat.set(new Vector3d(-0.9, 0.5, -1.0));
  167.     cylinderTrans.setTransform(cylinderMat);
  168.     cylinderTrans.addChild(new Cylinder(.35f, 2.0f,Cylinder.GENERATE_NORMALS |
  169.                               Cylinder.GENERATE_TEXTURE_COORDS, apEarth));
  170.         objTrans.addChild(cylinderTrans);
  171.  
  172.         objTrans.addChild(objScale);
  173.  
  174.  
  175.  
  176.  
  177.         // Set up the background
  178.         Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
  179.         Background bgNode = new Background(bgColor);
  180.         bgNode.setApplicationBounds(bounds);
  181.         objRoot.addChild(bgNode);
  182.  
  183.         // Set up the ambient light
  184.         Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
  185.         AmbientLight ambientLightNode = new AmbientLight(ambientColor);
  186.         ambientLightNode.setInfluencingBounds(bounds);
  187.         objRoot.addChild(ambientLightNode);
  188.  
  189.         // Set up the directional lights
  190.         Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
  191.         Vector3f light1Direction  = new Vector3f(4.0f, -7.0f, -12.0f);
  192.         Color3f light2Color = new Color3f(0.3f, 0.3f, 0.4f);
  193.         Vector3f light2Direction  = new Vector3f(-6.0f, -2.0f, -1.0f);
  194.  
  195.         DirectionalLight light1
  196.             = new DirectionalLight(light1Color, light1Direction);
  197.         light1.setInfluencingBounds(bounds);
  198.         objRoot.addChild(light1);
  199.           
  200.         DirectionalLight light2
  201.             = new DirectionalLight(light2Color, light2Direction);
  202.         light2.setInfluencingBounds(bounds);
  203.         objRoot.addChild(light2);
  204.  
  205.         apText.setMaterial(mm);
  206.  
  207.           // Create the rotate behavior node
  208.           MouseRotate behavior = new MouseRotate();
  209.           behavior.setTransformGroup(objTrans);
  210.           objTrans.addChild(behavior);
  211.           behavior.setSchedulingBounds(bounds);
  212.  
  213.           // Create the zoom behavior node
  214.           MouseZoom behavior2 = new MouseZoom();
  215.           behavior2.setTransformGroup(objTrans);
  216.           objTrans.addChild(behavior2);
  217.           behavior2.setSchedulingBounds(bounds);
  218.  
  219.           // Create the translate behavior node
  220.           MouseTranslate behavior3 = new MouseTranslate();
  221.           behavior3.setTransformGroup(objTrans);
  222.           objTrans.addChild(behavior3);
  223.           behavior3.setSchedulingBounds(bounds);
  224.  
  225.  
  226.         // Have Java 3D perform optimizations on this scene graph.
  227.         objRoot.compile();
  228.  
  229.     return objRoot;
  230.     }
  231.  
  232.     public BboardPt() {
  233.     }
  234.  
  235.     public BboardPt(java.net.URL earthURL, java.net.URL stoneURL) {
  236.         earthImage = earthURL;
  237.     stoneImage = stoneURL;
  238.     }
  239.       
  240.     public void init() {
  241.         // the paths to the image files for an applet
  242.         if (earthImage == null) {
  243.         try {
  244.             earthImage = new java.net.URL(getCodeBase().toString() +
  245.                           "../images/earth.jpg");
  246.         }
  247.         catch (java.net.MalformedURLException ex) {
  248.             System.out.println(ex.getMessage());
  249.         System.exit(1);
  250.         }
  251.     }
  252.     if (stoneImage == null) {
  253.       try {
  254.           stoneImage = new java.net.URL(getCodeBase().toString() +
  255.                         "../images/stone.jpg");
  256.       }
  257.       catch (java.net.MalformedURLException ex) {
  258.           System.out.println(ex.getMessage());
  259.           System.exit(1);
  260.       }
  261.     }
  262.       
  263.     setLayout(new BorderLayout());
  264.     Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
  265.     add("Center", c);
  266.  
  267.     // Create a simple scene and attach it to the virtual universe
  268.     BranchGroup scene = createSceneGraph();
  269.     SimpleUniverse u = new SimpleUniverse(c);
  270.  
  271.         // This will move the ViewPlatform back a bit so the
  272.         // objects in the scene can be viewed.
  273.         u.getViewingPlatform().setNominalViewingTransform();
  274.  
  275.     u.addBranchGraph(scene);
  276.     }    
  277.  
  278.     //
  279.     // The following allows BboardPt to be run as an application
  280.     // as well as an applet
  281.     //
  282.     public static void main(String[] args) {
  283.         java.net.URL earthURL = null;
  284.     java.net.URL stoneURL = null;
  285.     try {
  286.         // the paths to the image files for an application
  287.         earthURL = new java.net.URL("file:../images/earth.jpg");
  288.         stoneURL = new java.net.URL("file:../images/stone.jpg");
  289.     }
  290.     catch (java.net.MalformedURLException ex) {
  291.         System.out.println(ex.getMessage());
  292.         System.exit(1);
  293.     }
  294.         
  295.     new MainFrame(new BboardPt(earthURL, stoneURL), 400, 400);
  296.     }
  297. }
  298.